package com.ws.demo1.demos.ConcurrencyBasics;

/**
 * 多个线程访问同一个对象时，调用这个对象的方法得到不正确的结果。
 * 这种称之为线程安全问题
 *
 * 解决并发问题的方法：
 *
 *
 * 无锁：局部变量 ， 不可变对象，ThreadLocal,CAS原子类
 *
 * 有锁：synchronized 和reentranLock可重入锁。
 *
 *
 */
public class SolutionDemo {

    //善用局部变量可以避免线程安全问题
    //因为局部变量仅存在与每个线程的工作内存中。
    public void test(){
        int i = 0;
        i++;
        System.out.println(i);
    }

    /**
     * 不可变对象
     *不可变对象是指一经创建，
     * 则对外的状态就不会改变的对象。如果一个对象的状态不变，
     * 无落多少个线程，对其如何操作，都不改变。
     * 例如字符串对象就是不可变对象。String s = "a"，
     * 指字面值a是不可变的，而引用s可以变。
     */


    /**
     * ThreadLocal本质是在每个线程有自己的一个副本，每个线程的副本互不影响。
     */


    /**
     * CAS原子类
     */

    /**
     * Synchronized和ReentrantLock都采用悲观锁策略。
     *
     * Synchronized是语言层面
     *
     * ReentrantLock是编程方式实现
     *
     */


















}
